/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package redinftel.formularios;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import redinftel.entidades.Amistad;
import redinftel.entidades.Lista;
import redinftel.entidades.ListaAmigos;
import redinftel.entidades.Usuario;
import redinftel.sesiones.ListaAmigosFacadeRemote;
import redinftel.sesiones.ListaFacadeRemote;
import redinftel.sesiones.UsuarioFacadeRemote;

/**
 *Clase
 *@author Six Degrees Team
 */
@ManagedBean
@RequestScoped
public class ListaamigosBean {

    @EJB
    private UsuarioFacadeRemote usuarioFacade;
    @EJB
    private ListaAmigosFacadeRemote listaAmigosFacade;
    @EJB
    private ListaFacadeRemote listaFacade;
    private static final String USUARIO = "usuario";
    BigDecimal idLista;
    private String nombre;
    private Usuario idUsuarioCreador;
    private String error;
    private List<Lista> listaAmigos;
    private List<Usuario> amigos;
    private List<Usuario> resultadoBusqueda;
    private String cadena;
    private BigDecimal idAmigo;
    private int codigoError;
    private HashSet<Usuario> todos;

    public int getCodigoError() {
        return codigoError;
    }

    public void setCodigoError(int codigoError) {
        this.codigoError = codigoError;
    }

    public BigDecimal getIdAmigo() {
        return idAmigo;
    }

    public void setIdAmigo(BigDecimal idAmigo) {
        this.idAmigo = idAmigo;
    }

    /** Creates a new instance of ListaamigosBean */
    public ListaamigosBean() {
         FacesContext fctx = FacesContext.getCurrentInstance();
            HttpSession session = (HttpSession) fctx.getExternalContext().getSession(false);
            idUsuarioCreador = (Usuario) session.getAttribute(USUARIO);
          ChangeLocaleBean.cambiar();

    }

    public List<Usuario> getResultadoBusqueda() {
        return resultadoBusqueda;
    }

    public HashSet<Usuario> getTodos() {

             todos = new HashSet<Usuario>();
            
        for (Amistad amistad : idUsuarioCreador.getAmistadCollection()) {
            if (idUsuarioCreador != amistad.getIdAmigo1()) {
                todos.add(amistad.getIdAmigo1());
            } else {
                todos.add(amistad.getIdAmigo2());
            }
        }
        for (Amistad amistad : idUsuarioCreador.getAmistadCollection1()) {
            if (idUsuarioCreador != amistad.getIdAmigo1()) {
                todos.add(amistad.getIdAmigo1());
            } else {
                todos.add(amistad.getIdAmigo2());
            }
        }

        return todos;
    }
/**
 *
 * @param todos
 */
    public void setTodos(HashSet<Usuario> todos) {
        this.todos = todos;
    }
/**
 *
 * @return
 */
    public String buscarAmigo() {
        FacesContext fctx = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fctx.getExternalContext().getSession(false);
        idUsuarioCreador = (Usuario) session.getAttribute(USUARIO);
        nombre = (String) session.getAttribute("lista");
        resultadoBusqueda = usuarioFacade.findAll();
        if (idUsuarioCreador != null) {
            resultadoBusqueda = usuarioFacade.findAmigosMinusLista(idUsuarioCreador, cadena.toUpperCase());
            List<Usuario> temporal = new ArrayList<Usuario>();
            temporal.addAll(resultadoBusqueda);
            for (Usuario amigo : temporal) {
                if (contiene(amigo.getListaAmigosCollection(), nombre)) {
                    resultadoBusqueda.remove(amigo);
                }
            }
        }
        //error="";
        codigoError = 1;
        if (resultadoBusqueda.isEmpty()) {
            // error = "No hay amigos par añadir a esta lista";
            codigoError = 2;
        }
        return "mostrarLista";
    }
/**
 *
 * @param resultadoBusqueda
 */
    public void setResultadoBusqueda(List<Usuario> resultadoBusqueda) {
        this.resultadoBusqueda = resultadoBusqueda;
    }
/**
 *
 * @return cadena
 */
    public String getCadena() {
        return cadena;
    }

    public void setCadena(String cadena) {
        this.cadena = cadena;
    }
/**
 *
 * @return lista de amigos
 */
    public List<Lista> getListaAmigos() {
        if (idUsuarioCreador == null) {
            FacesContext fctx = FacesContext.getCurrentInstance();
            HttpSession session = (HttpSession) fctx.getExternalContext().getSession(false);
            idUsuarioCreador = (Usuario) session.getAttribute(USUARIO);
        }
        listaAmigos = listaFacade.findByUsuario(idUsuarioCreador);
        return listaAmigos;
    }
/**
 *
 * @return amigos
 */
    public List<Usuario> getAmigos() {
        FacesContext fctx = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fctx.getExternalContext().getSession(false);
        idUsuarioCreador = (Usuario) session.getAttribute(USUARIO);
        nombre = fctx.getExternalContext().getRequestParameterMap().get("lista");
        if (nombre == null || nombre.equals("")) {
            nombre = (String) session.getAttribute("lista");
        }
        session.setAttribute("lista", nombre);
        if (idUsuarioCreador != null) {
            amigos = listaAmigosFacade.findAmigosByLista(idUsuarioCreador, nombre);
        }
        if (amigos.isEmpty()) {
            //error = "Lista vacia. Busca amigos para agregar.";
            codigoError = 3;
        } else {//error="";
            codigoError = 4;
        }
        return amigos;
    }

    public void setAmigos(List<Usuario> amigos) {
        this.amigos = amigos;
    }

    public void setListaAmigos(List<Lista> listaAmigos) {
        this.listaAmigos = listaAmigos;
    }

    public ListaFacadeRemote getListaFacade() {
        return listaFacade;
    }
/**
 *
 * @param listaFacade
 */
    public void setListaFacade(ListaFacadeRemote listaFacade) {
        this.listaFacade = listaFacade;
    }

    public BigDecimal getIdLista() {
        return idLista;
    }

    public void setIdLista(BigDecimal idLista) {
        this.idLista = idLista;
    }

    public Usuario getIdUsuarioCreador() {
        return idUsuarioCreador;
    }

    public void setIdUsuarioCreador(Usuario idUsuarioCreador) {
        this.idUsuarioCreador = idUsuarioCreador;
    }
/**
 *
 * @return nombre
 */
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
/**
 *
 * @param lista
 * @param var
 * @return
 */
    private boolean contiene(List<Lista> lista, Lista var) {
        boolean contiene = false;
        Iterator iter = lista.iterator();
        while (iter.hasNext() && !contiene) {
            Lista aux = (Lista) iter.next();
            contiene = aux.getNombre().equals(var.getNombre())
                    && aux.getIdUsuarioCreador().equals(var.getIdUsuarioCreador());
        }
        return contiene;
    }
/**
 *
 * @return me redirige a lista de amigos o al index
 *  crea una lista de amigos
 */
    public String doCrearLista() {
        FacesContext fctx = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fctx.getExternalContext().getSession(false);
        idUsuarioCreador = (Usuario) session.getAttribute(USUARIO);
        List<Lista> listas = getListaAmigos();
        if (idUsuarioCreador != null) {
            Lista lista = new Lista();
            lista.setNombre(nombre);
            BigDecimal id = new BigDecimal(1);
            List<BigDecimal> max = listaFacade.findPK();
            if (max.get(0) != null) {
                id = id.add(max.get(0));
            }
            lista.setIdLista(id);
            lista.setIdUsuarioCreador(idUsuarioCreador);
            if (!contiene(listas, lista)) {
                listaFacade.create(lista);
                //error = "";
                codigoError = 5;
            } else {
                setError("Ya tiene una lista de amigos llamada:" + nombre);
            }
            return "lista_amigos";
        } else {
            return "index";
        }
    }
/*
 * Metodo que agrega los amigos
 */
    public String doAgregarAmigo() {
        FacesContext fctx = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fctx.getExternalContext().getSession(false);
        idUsuarioCreador = (Usuario) session.getAttribute(USUARIO);
        if (idUsuarioCreador == null) {
            return "index";
        }
        String id = fctx.getExternalContext().getRequestParameterMap().get("idAmigoSeleccionado");
        BigDecimal idUsuario = new BigDecimal(id);
        nombre = (String) session.getAttribute("lista");
        ListaAmigos ls = new ListaAmigos();
        ls.setIdLista(listaFacade.findBynombre(nombre));
        ls.setIdUsuario(usuarioFacade.find(idUsuario));
        BigDecimal idLA = new BigDecimal(1);
        List<BigDecimal> pks = listaAmigosFacade.findPk();
        if (pks.get(0) != null) {
            idLA = idLA.add(pks.get(0));
        }
        ls.setIdListaAmigo(idLA);
        listaAmigosFacade.create(ls);
        cadena = "";
        // error="";
        codigoError = 6;
        return "mostrarLista";
    }
/**
 *
 * @return error
 */
    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }
/**
 *
 * @param listaAmigosCollection
 * @param nombre
 * @return devuelve encontrado si el nombre esta contenido en la collecion de la lista de amigos
 */
    private boolean contiene(Collection<ListaAmigos> listaAmigosCollection, String nombre) {
        boolean encontrado = false;
        Iterator iter = listaAmigosCollection.iterator();
        while (iter.hasNext() && !encontrado) {
            ListaAmigos ls = (ListaAmigos) iter.next();
            encontrado = ls.getIdLista().getNombre().equals(nombre);
        }
        return encontrado;
    }
/**
 *
 * @return me redirige a una pagina o otra se no encuentra el usuario
 * me redirige a index y en otro caso me redirige a la pagina de mostrar lista
 */
    public String doEliminar() {
        FacesContext fctx = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fctx.getExternalContext().getSession(false);
        idUsuarioCreador = (Usuario) session.getAttribute(USUARIO);
        if (idUsuarioCreador == null) {
            return "index";
        }
        String id = fctx.getExternalContext().getRequestParameterMap().get("idLista");
        idLista = new BigDecimal(id);
        Lista l = new Lista(idLista);
        listaFacade.remove(l);
        // error="";
        codigoError = 7;
        return "mostrarLista";
    }
/**
 *
 * @return me redirige al index o  mostrarlista
 */
    public String doQuitarAmigo() {
        FacesContext fctx = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fctx.getExternalContext().getSession(false);
        idUsuarioCreador = (Usuario) session.getAttribute(USUARIO);
        if (idUsuarioCreador == null) {
            return "index";
        }
        String id = fctx.getExternalContext().getRequestParameterMap().get("idAmigo1");
        idAmigo = new BigDecimal(id);
        nombre = (String) session.getAttribute("lista");
        Lista l = listaFacade.findBynombre(nombre);
        ListaAmigos ls = listaAmigosFacade.findByListaAmigo(l, idAmigo);
        listaAmigosFacade.remove(ls);
        //error="";
        codigoError = 8;
        return "mostrarLista";
    }
}
